package main

import (
	"fmt"
	"os"
	"os/exec"
	"path/filepath"
	"time"

	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/clientcmd"
	"k8s.io/client-go/util/homedir" // 添加这一行
)

// K8sConfig Kubernetes 配置结构
type K8sConfig struct {
	KubeconfigPath string        // kubeconfig 文件路径
	Namespace      string        // 默认命名空间
	Context        string        // K8s 上下文
	Timeout        time.Duration // 操作超时时间
}

// K8sMCPServer Kubernetes MCP 服务器结构
type K8sMCPServer struct {
	config     K8sConfig
	clientset  *kubernetes.Clientset
	kubeconfig string
}

// NewK8sMCPServer 创建新的 Kubernetes MCP 服务器
func NewK8sMCPServer(config K8sConfig) (*K8sMCPServer, error) {
	// 确定 kubeconfig 文件路径
	kubeconfigPath := config.KubeconfigPath
	if kubeconfigPath == "" {
		// 优先使用项目目录下的kube-config文件
		projectKubeconfig := "config/kube-config"
		if _, err := os.Stat(projectKubeconfig); err == nil {
			kubeconfigPath = projectKubeconfig
		} else if home := homedir.HomeDir(); home != "" {
			kubeconfigPath = filepath.Join(home, ".kube", "config")
		}
	}

	// 检查 kubectl 是否可用
	if err := checkKubectlAvailable(); err != nil {
		return nil, fmt.Errorf("kubectl 不可用: %v", err)
	}

	// 创建 Kubernetes 客户端配置
	kubeConfig, err := clientcmd.BuildConfigFromFlags("", kubeconfigPath)
	if err != nil {
		return nil, fmt.Errorf("构建 kubeconfig 失败: %v", err)
	}

	// 创建 Kubernetes 客户端
	clientset, err := kubernetes.NewForConfig(kubeConfig)
	if err != nil {
		return nil, fmt.Errorf("创建 Kubernetes 客户端失败: %v", err)
	}

	server := &K8sMCPServer{
		config:     config,
		clientset:  clientset,
		kubeconfig: kubeconfigPath,
	}

	// 测试连接
	if err := server.testConnection(); err != nil {
		return nil, fmt.Errorf("测试 Kubernetes 连接失败: %v", err)
	}

	return server, nil
}

// checkKubectlAvailable 检查 kubectl 是否可用
func checkKubectlAvailable() error {
	cmd := exec.Command("kubectl", "version", "--client")
	return cmd.Run()
}

// testConnection 测试 Kubernetes 集群连接
func (k *K8sMCPServer) testConnection() error {
	// 尝试获取集群信息
	_, err := k.clientset.Discovery().ServerVersion()
	if err != nil {
		return fmt.Errorf("无法连接到 Kubernetes 集群: %v", err)
	}

	return nil
}

// executeKubectl 执行 kubectl 命令
func (k *K8sMCPServer) executeKubectl(args ...string) ([]byte, error) {
	// 准备命令参数
	cmdArgs := []string{}

	// 添加 kubeconfig 参数
	if k.kubeconfig != "" {
		cmdArgs = append(cmdArgs, "--kubeconfig", k.kubeconfig)
	}

	// 添加 context 参数
	if k.config.Context != "" {
		cmdArgs = append(cmdArgs, "--context", k.config.Context)
	}

	// 添加用户提供的参数
	cmdArgs = append(cmdArgs, args...)

	// 创建命令
	cmd := exec.Command("kubectl", cmdArgs...)

	// 设置环境变量
	if k.kubeconfig != "" {
		cmd.Env = append(os.Environ(), fmt.Sprintf("KUBECONFIG=%s", k.kubeconfig))
	}

	// 执行命令
	output, err := cmd.CombinedOutput()
	if err != nil {
		return output, fmt.Errorf("kubectl 命令执行失败: %v, 输出: %s", err, string(output))
	}

	return output, nil
}
